﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProtocoloCarSharing;
using System.Threading;

namespace AppAgenteVehiculo
{
    public class Cliente
    {
        public string NombreUsuario { get; set; }
        public string Password { get; set; }
        public string TipoServicio { get; set; }

        private Viaje _viaje;

        public Viaje Viaje
        {
            get { return _viaje; }
        }

        public Cliente(string nombreUsuario, string password)
        {
            NombreUsuario = nombreUsuario;
            Password = password;
            _viaje = new Viaje();
        }

        public bool IdentificarUsario()
        {
            bool identificado = false;
            string clienteId = NombreUsuario + Protocolo.SEPARADOR + Password;
            MensajeProtocolo msjReq = new MensajeProtocolo(Protocolo.Header.REQ, Protocolo.Comando.IDENTIFICAR_USUARIO, clienteId.Length, clienteId);
            MensajeProtocolo msjRes = ConnectionSocket.SocketSendReceive(msjReq);

            if (msjRes.Header.Equals(Protocolo.Header.RES) && msjRes.Cmd.Equals(Protocolo.Comando.IDENTIFICAR_USUARIO))
            {
                List<string> respuestas = msjRes.InfoDatos();
                if (respuestas[0].ToUpper().Equals(NombreUsuario.ToUpper()) && respuestas[1].Equals(Protocolo.OK))
                {
                    identificado = true;
                }
            }
            else
            {
                if (msjRes.Cmd.Equals(Protocolo.Comando.SERVIDOR_FUERA_DE_SERVICIO))
                {
                    Console.WriteLine("Servicio Fuera de Servicio, intente nuevamente mas tarde.\n");
                }
            }
            
            return identificado;
        }

        public void IniciarViaje()
        {
            Viaje.IniciarViaje();
            Thread mandarInfo = new Thread(MandarInfoCliente);
            mandarInfo.Start();

        }

        public void MandarInfoCliente()
        {
            while (Viaje.ViajeIniciado)
            {
                string estadoDeServicio = Protocolo.EN_SERVICIO;
                if (!Viaje.ViajeIniciado)
                {
                    estadoDeServicio = Protocolo.FUERA_DE_SERVICIO;
                }
                string clienteInfo =  NombreUsuario + Protocolo.SEPARADOR +  Password + Protocolo.SEPARADOR + 
                    Program.vehiculo.Latitud + Protocolo.SEPARADOR + Program.vehiculo.Longitud + Protocolo.SEPARADOR + Viaje.KilometrajeRecorrido + Protocolo.SEPARADOR +
                    estadoDeServicio + Protocolo.SEPARADOR + Program.vehiculo.Id;
                MensajeProtocolo msjReq = new MensajeProtocolo(Protocolo.Header.REQ, Protocolo.Comando.CONSUMO, clienteInfo.Length, clienteInfo);
                MensajeProtocolo msjRes = ConnectionSocket.SocketSendReceive(msjReq);

                if (msjRes.Header.Equals(Protocolo.Header.RES) && msjRes.Cmd.Equals(Protocolo.Comando.CONSUMO))
                {
                    List<string> respuestas = msjRes.InfoDatos();
                    if (respuestas[0].Equals(NombreUsuario))
                    {
                        switch (respuestas[1])
                        {
                            case (Protocolo.OK):
                                Viaje.KilometrajeRecorrido = 0;
                                break;
                            case (Protocolo.SIN_SALDO_DISP):
                                Viaje.KilometrajeRecorrido = 0;
                                Console.WriteLine("No le queda saldo dispoible por favor abandone el vehiculo.");
                                break;
                            default:
                                break;
                        }
                    }
                }
                else
                {
                    if (msjRes.Cmd.Equals(Protocolo.Comando.SERVIDOR_FUERA_DE_SERVICIO))
                    {
                        Console.WriteLine("Servicio Fuera de Servicio, intente nuevamente mas tarde.\n");
                    }
                }
                Thread.Sleep(3000);
            }
        }
    }
}
